home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 096 / command.lbr / command.c next >
Text File  |  2011-01-28  |  6KB  |  279 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. /*
  5.     A replacement for COMMAND.COM
  6.  
  7.     T. Jennings 28 Dec 84
  8.  
  9.     Docs? You cant be serious ...
  10.  
  11. */
  12.  
  13. version = 0;            /* initial (ahem) version */
  14. char drive = 'A';
  15. unsigned rnd;            /* fake random number */
  16.  
  17. #define same(s1,s2) (strcmp(s1,s2) == 0)
  18.  
  19. main() {
  20.  
  21. long l;
  22. char ln[132];
  23. char cmd[80],*arg,*cp;
  24.  
  25.     for (l= 10000L; l > 0L; l--);        /* look busy */
  26.  
  27.     cprintf("Current date is Tue  1-01-1980\r\n");
  28.     get(ln,"Enter New date: ");
  29.     cprintf("Current time is 0:01:21.32\r\n");
  30.     get(ln,"Enter new time: ");
  31.  
  32.     cprintf("\r\n\r\nThe IBM Personal Computer DOS\r\n");
  33.     cprintf("Version 2.00 (C)Copywrong IBM Corp 1981, 1982, 1983 so there\r\n");
  34.  
  35.  
  36. /* Now the fun starts */
  37.  
  38.     drive= 'A';
  39.     while (1) {
  40.         cprintf("%c>",drive);
  41.         drive+= 7; if (drive > 'Z') drive= 'A';
  42.         get(ln,"");            /* get command line */
  43.         arg= cmd;            /* copy of command name */
  44.         cp= ln;
  45.         while (*cp && (*cp != ' '))
  46.             *arg++= *cp++;
  47.         *arg= '\0';            /* terminate cmd name */
  48.         while (*cp && (*cp == ' '))    /* skip spaces, etc */
  49.             ++cp;
  50.         arg= cp;            /* arg is cmd tail */
  51.  
  52.         if (same(cmd,"dir")) dir();
  53.         else if (same(cmd,"ver")) ver();
  54.         else if (same(cmd,"cd")) cd(arg);
  55.         else if (same(cmd,"chdir")) cd(arg);
  56.         else if (same(cmd,"date")) date(arg);
  57.         else if (same(cmd,"time")) time(arg);
  58.         else if (same(cmd,"ren")) del(arg);
  59.         else if (same(cmd,"del")) del(arg);
  60.         else if (same(cmd,"erase")) del(arg);
  61.         else if (same(cmd,"prompt")) prompt(arg);
  62.         else if (same(cmd,"set")) set(arg);
  63.         else if (same(cmd,"exit")) exitc();
  64.         else if (same(cmd,"plugh")) goway();
  65.         else if (strlen(cmd) > 0) command(cmd,arg);
  66.     }
  67. }
  68. /* Go away */
  69.  
  70. goway() {
  71.     cprintf("\r\n");
  72.     cprintf("COMMAND.EXE -- 28 Dec 84 T. Jennings\r\n");
  73.     exit();
  74. }
  75. /* Display wrong MSDOS version */
  76.  
  77. ver() {
  78.     version += 137;
  79.     cprintf("IBM Personal Computer DOS version 2.%d\r\n",version);
  80.     cprintf("\r\n");
  81. }
  82.  
  83. /* DOS prompt */
  84.  
  85. prompt() {
  86.  
  87.     cprintf("But I like the prompt as it is\r\n");
  88.     cprintf("\r\n");
  89. }
  90. /* set environment */
  91.  
  92. set(s)
  93. char *s;
  94. {
  95.     if (strlen(s)) cprintf("%s? ",s);
  96.     cprintf("That sounds interesting\r\n");
  97.     cprintf("\r\n");
  98. }
  99. /* Exit program */
  100.  
  101. exitc() {
  102.  
  103.     cprintf("No, I am not going away.\r\n");
  104.     cprintf("\r\n");
  105. }
  106. /* delete some files */
  107.  
  108. del() {
  109.     disk(); disk();
  110.  
  111.     if (chance(50)) dosmsg();
  112.     else cprintf("File not found\r\n");
  113.     cprintf("\r\n");
  114. }
  115. /* dont list disk files */
  116.  
  117. dir() {
  118.  
  119.     if (chance(30)) dosmsg();
  120.     else {
  121.         disk();
  122.         cprintf("Volume in drive %c: label fell off\r\n",drive);
  123.         disk(); disk();
  124.         cprintf("Directory of  %c:\\\r\n",drive);
  125.         cprintf("\r\nFile not frammished\r\n");
  126.     }
  127.     cprintf("\r\n");
  128. }
  129. /* Refuse to change directories */
  130.  
  131. cd(arg)
  132. char *arg;
  133. {
  134.     if (chance(40)) dosmsg();
  135.     else cprintf("Invalid directory\r\n");
  136.     cprintf("\r\n");
  137. }
  138. /* Set the time */
  139.  
  140. time() {
  141.     if (chance(35)) cprintf("Time? Who has time?\r\n");
  142.     else if (chance(15)) cprintf("I forget\r\n");
  143.     else cprintf("Buy a watch\r\n");
  144.     cprintf("\r\n");
  145. }
  146.  
  147. /* Set the date */
  148.  
  149. date() {
  150.     if (chance(25)) cprintf("My birthday!\r\n");
  151.     else if (chance(25)) cprintf("Most banks give out calendars, why not ask for one next time you're in?\r\n");
  152.     else cprintf("Sometime after 1980\r\n");
  153.     cprintf("\r\n");
  154. }
  155. /* Display a prompt, input a line of text, convert it to all
  156. lower case. While we're at it, generate a fake random number by
  157. continually incrementing an integer while waiting for a key. */
  158.  
  159. get(l,p)
  160. char l[];
  161. char *p;
  162. {
  163. int i,j;
  164. char c;
  165.  
  166.     cprintf("%s",p);
  167.     i= 0;
  168.     while (1) {
  169.         while (! (c= bdos(6,0xff))) rnd += 17;
  170.  
  171. /* Backspace and delete: MOST of the time, do it right. Once in a while,
  172. backspace by deleting the whole line, and restoring it all except the
  173. last deleted character. */
  174.  
  175.         if ((c == 8) || (c == 127)) {
  176.             if (i > 0) {
  177.                 if (chance(30)) {
  178.                     for (j= i; j--;) cprintf("\010 \010");
  179.                     --i;
  180.                     for (j= 0; j < i; j++) bdos(6,l[j]);
  181.  
  182.                 } else {
  183.                     --i;
  184.                     cprintf("\010 \010");
  185.                 }
  186.             }
  187.  
  188. /* since control-c probably means banging on the keyboard in frustration,
  189. be nasty. */
  190.  
  191.         } else if (c == 3) {
  192.             switch (rnd % 4) {
  193.                 case 0: cprintf("Ouch!\07\r\n"); break;
  194.                 case 1: cprintf("Cut it out!\r\n"); break;
  195.                 case 2: cprintf("Stop it!\r\n"); break;
  196.                 case 3: cprintf("That hurts!\r\n"); break;
  197.             }
  198.             i= 0;
  199.             break;
  200.  
  201. /* Carriage return: be merciful */
  202.  
  203.         } else if (c == 13) {
  204.             cprintf("\r\n");
  205.             break;
  206.  
  207. /* Tabs are fun. Space over a random number of spaces */
  208.  
  209.         } else if (c == 9) {
  210.             for (j= (rnd % 6) + 4; j > 0; --j) {
  211.                 bdos(6,' ');
  212.                 l[i++]= ' ';
  213.             }
  214.  
  215. /* Control characters: normal until I figure out what to do */
  216.  
  217.         } else if (c < ' ') {
  218.             cprintf("^%c",c + '@');
  219.  
  220.         } else {
  221.             bdos(6,c);
  222.             l[i++]= c;
  223.         }
  224.     }
  225.  
  226.     l[i]= '\0';
  227.     for (i= 0; l[i]; i++) l[i]= tolower(l[i]);
  228. }
  229.  
  230. /* Chance: the number given is a percentage of 100, return true if
  231. we are in range. */
  232.  
  233. chance(n)
  234. int n;
  235. {
  236.     return(n > (rnd % 100));
  237. }
  238. /* make the disk look busy. */
  239.  
  240. disk() {
  241.  
  242. int n,i;
  243. long l;
  244.  
  245.     for (i= 2; i--;) {
  246.         n= _xopen("foo",0);
  247.         for (l= 1000L; l > 0L; l--);
  248.         if (n != -1) _xclose(n);
  249.     }
  250. }
  251. /* Randomly choose a DOS message */
  252.  
  253. dosmsg() {
  254. int i;
  255.  
  256.     i= rnd % 10;
  257.     switch (i) {
  258.  
  259.         case 0: cprintf("What was that? I wasnt paying attention\r\n"); break;
  260.         case 1: cprintf("Invalid directory\r\n"); break;
  261.         case 2: cprintf("Insufficient disk space\r\n"); break;
  262.         case 3: cprintf("Do you hear music?\r\n"); break;
  263.         case 4: cprintf("Invalid number of parameters\r\n"); break;
  264.         case 5: cprintf("Duplicate File name or File not found or I lost it\r\n"); break;
  265.         case 6: cprintf("I see no  FILES  here\r\n"); break;
  266.         case 7: cprintf("Nothing happens\r\n"); break;
  267.         case 8: cprintf("Insufficient memory\r\n"); break;
  268.         case 9: cprintf("Error creating file or pipe\r\n"); break;
  269.         default: printf("rnd = %d default?\r\n",i); break;
  270.     }
  271. }
  272.  
  273. /* "execute" a command */
  274.  
  275. command() {
  276.     disk(); disk(); disk();
  277.     cprintf("Bad commmmmmmand or file name\r\n");
  278. }
  279.